{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "samples_and = np.array([[0, 0, 0],[1, 0, 0],[0, 1, 0],[1, 1, 1],])\n",
    "samples_or =  np.array([[0, 0, 0],[1, 0, 1],[0, 1, 1],[1, 1, 1],])\n",
    "samples_xor = np.array([[0, 0, 0],[1, 0, 1],[0, 1, 1],[1, 1, 0],])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 下面用数学公式来解释上面的samples，等价于下面的不等式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 逻辑与操作\n",
    "$$ \\begin{cases}\n",
    "0*w_1 + 0*w_2 + b <= 0 \\\\ \n",
    "1*w_1 + 0*w_2 + b <= 0 \\\\\n",
    "0*w_1 + 1*w_2 + b <= 0 \\\\\n",
    "1*w_1 + 1*w_2 + b > 0 \n",
    "\\end{cases} $$\n",
    "#### 逻辑或操作\n",
    "$$ \\begin{cases}\n",
    "0*w_1 + 0*w_2 + b <= 0 \\\\ \n",
    "1*w_1 + 0*w_2 + b > 0 \\\\\n",
    "0*w_1 + 1*w_2 + b > 0 \\\\\n",
    "1*w_1 + 1*w_2 + b > 0 \n",
    "\\end{cases} $$\n",
    "#### 逻辑与非操作\n",
    "$$ \\begin{cases}\n",
    "0*w_1 + 0*w_2 + b <= 0 \\\\ \n",
    "1*w_1 + 0*w_2 + b > 0 \\\\\n",
    "0*w_1 + 1*w_2 + b > 0 \\\\\n",
    "1*w_1 + 1*w_2 + b <= 0 \n",
    "\\end{cases} $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 根据w和b的梯度，能够比较快速的求解出一个满足不等式的解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def perceptron(samples):\n",
    "    w = np.array([1, 2])\n",
    "    b = 0\n",
    "    a = 1\n",
    "    for i in range(10):\n",
    "        for j in range(4):\n",
    "            x = np.array(samples[j][:2])\n",
    "            y = 1 if np.dot(w, x) + b > 0 else 0\n",
    "            d = np.array(samples[j][2])\n",
    "\n",
    "            delta_b = a*(d-y)\n",
    "            delta_w = a*(d-y)*x\n",
    "\n",
    "            print('epoch {} sample {}  [{} {} {} {} {} {} {}]'.format(\n",
    "                i, j, w[0], w[1], b, y, delta_w[0], delta_w[1], delta_b\n",
    "            ))\n",
    "            w = w + delta_w\n",
    "            b = b + delta_b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑与操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 0 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 0 sample 1  [1 2 0 1 -1 0 -1]\n",
      "epoch 0 sample 2  [0 2 -1 1 0 -1 -1]\n",
      "epoch 0 sample 3  [0 1 -2 0 1 1 1]\n",
      "epoch 1 sample 0  [1 2 -1 0 0 0 0]\n",
      "epoch 1 sample 1  [1 2 -1 0 0 0 0]\n",
      "epoch 1 sample 2  [1 2 -1 1 0 -1 -1]\n",
      "epoch 1 sample 3  [1 1 -2 0 1 1 1]\n",
      "epoch 2 sample 0  [2 2 -1 0 0 0 0]\n",
      "epoch 2 sample 1  [2 2 -1 1 -1 0 -1]\n",
      "epoch 2 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 2 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 3 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 3 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 3 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 3 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 4 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 4 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 4 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 4 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 5 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 5 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 5 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 5 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 6 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 6 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 6 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 6 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 7 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 7 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 7 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 7 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 8 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 8 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 8 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 8 sample 3  [1 2 -2 1 0 0 0]\n",
      "epoch 9 sample 0  [1 2 -2 0 0 0 0]\n",
      "epoch 9 sample 1  [1 2 -2 0 0 0 0]\n",
      "epoch 9 sample 2  [1 2 -2 0 0 0 0]\n",
      "epoch 9 sample 3  [1 2 -2 1 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "perceptron(samples_and)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 根据输出可得当epoch = 2，3时，w, b的值不再改变，对应梯度也为0。 所以当epoch = 3时，可以得到不等式的一个解。(w1=1, w2=2,b =-2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑或操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 0 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 0 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 1 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 1 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 1 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 1 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 2 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 2 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 2 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 2 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 3 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 3 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 3 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 3 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 4 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 4 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 4 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 4 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 5 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 5 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 5 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 5 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 6 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 6 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 6 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 6 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 7 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 7 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 7 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 7 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 8 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 8 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 8 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 8 sample 3  [1 2 0 1 0 0 0]\n",
      "epoch 9 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 9 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 9 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 9 sample 3  [1 2 0 1 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "perceptron(samples_or)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 根据输出可得当epoch = 0，1时，w, b的值不再改变，对应梯度也为0。 所以当epoch = 1时，可以得到不等式的一个解。(w1=1, w2=2,b =0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑异或操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 0 sample 0  [1 2 0 0 0 0 0]\n",
      "epoch 0 sample 1  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 2  [1 2 0 1 0 0 0]\n",
      "epoch 0 sample 3  [1 2 0 1 -1 -1 -1]\n",
      "epoch 1 sample 0  [0 1 -1 0 0 0 0]\n",
      "epoch 1 sample 1  [0 1 -1 0 1 0 1]\n",
      "epoch 1 sample 2  [1 1 0 1 0 0 0]\n",
      "epoch 1 sample 3  [1 1 0 1 -1 -1 -1]\n",
      "epoch 2 sample 0  [0 0 -1 0 0 0 0]\n",
      "epoch 2 sample 1  [0 0 -1 0 1 0 1]\n",
      "epoch 2 sample 2  [1 0 0 0 0 1 1]\n",
      "epoch 2 sample 3  [1 1 1 1 -1 -1 -1]\n",
      "epoch 3 sample 0  [0 0 0 0 0 0 0]\n",
      "epoch 3 sample 1  [0 0 0 0 1 0 1]\n",
      "epoch 3 sample 2  [1 0 1 1 0 0 0]\n",
      "epoch 3 sample 3  [1 0 1 1 -1 -1 -1]\n",
      "epoch 4 sample 0  [0 -1 0 0 0 0 0]\n",
      "epoch 4 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 4 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 4 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 5 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 5 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 5 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 5 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 6 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 6 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 6 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 6 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 7 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 7 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 7 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 7 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 8 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 8 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 8 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 8 sample 3  [1 0 2 1 -1 -1 -1]\n",
      "epoch 9 sample 0  [0 -1 1 1 0 0 -1]\n",
      "epoch 9 sample 1  [0 -1 0 0 1 0 1]\n",
      "epoch 9 sample 2  [1 -1 1 0 0 1 1]\n",
      "epoch 9 sample 3  [1 0 2 1 -1 -1 -1]\n"
     ]
    }
   ],
   "source": [
    "perceptron(samples_xor)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 根据输出可得：即使外层循环了10次，依旧没有得到不等式的解。其实我们只要将不等式变成固定值的等式，从矩阵的知识可以判断这个联合等式方程是没有解的。下面我用画图的方式，来说明感知器代码不能完成逻辑异或功能。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 利用网格搜索法，找到多个不等式的解，并画出对应图像。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def net_search(samples, search_range):\n",
    "    ''' search_range: 搜索范围和步长:如[-10,10,1] '''\n",
    "    w1 = []\n",
    "    w2 = []\n",
    "    b = []\n",
    "    x = samples[:,:2]\n",
    "    d = samples[:,2:3]\n",
    "    for i in range(search_range[0],search_range[1],search_range[2]):\n",
    "        for j in range(search_range[0],search_range[1],search_range[2]):\n",
    "            for k in range(search_range[0],search_range[1],search_range[2]):\n",
    "                w = np.array([i,j])\n",
    "                y = x.dot(w.T) + k\n",
    "                y[y>0] = 1\n",
    "                y[y<=0] = 0\n",
    "                y = np.array([y])\n",
    "                if (y.T == d).all():\n",
    "                    w1.append(w[0])\n",
    "                    w2.append(w[1])\n",
    "                    b.append(k)\n",
    "    return w1,w2,b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑与操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "w1,w2,b = net_search(samples_and,[-4,4,1])\n",
    "i = -1.0\n",
    "x1 = []\n",
    "for n in range(30):\n",
    "    x1.append(i)\n",
    "    i += 0.1\n",
    "x1 = np.array(x1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_0 = np.argwhere(samples_and[:,2:3] > 0)\n",
    "x_n_0 = np.argwhere(samples_and[:,2:3] <= 0)\n",
    "plt.scatter(samples_and[x_0[:,0], 0], samples_and[x_0[:,0], 1], color = 'red', marker = 'D')\n",
    "plt.scatter(samples_and[x_n_0[:,0], 0], samples_and[x_n_0[:,0], 1], color = 'green', marker = 'D')\n",
    "for i in range(len(w1)):\n",
    "    x2 = (-b[i] - x1*w1[i])/w2[i]\n",
    "    plt.plot(x1, x2, color = 'skyblue', linewidth = 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 通过缩放网格搜索的范围，我得到了大概10多个不同的解并且在图片中画出来。每一条浅蓝色的直线代表对应一个解。每个解将整个图片分成两部分，能很好的将绿色的点和红色的点分开。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑或操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "w1,w2,b = net_search(samples_or,[-4,4,1])\n",
    "i = -1.0\n",
    "x1 = []\n",
    "for n in range(30):\n",
    "    x1.append(i)\n",
    "    i += 0.1\n",
    "x1 = np.array(x1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_0 = np.argwhere(samples_or[:,2:3] > 0)\n",
    "x_n_0 = np.argwhere(samples_or[:,2:3] <= 0)\n",
    "plt.scatter(samples_or[x_0[:,0], 0], samples_or[x_0[:,0], 1], color = 'red', marker = 'D')\n",
    "plt.scatter(samples_or[x_n_0[:,0], 0], samples_or[x_n_0[:,0], 1], color = 'green', marker = 'D')\n",
    "for i in range(len(w1)):\n",
    "    x2 = (-b[i] - x1*w1[i])/w2[i]\n",
    "    plt.plot(x1, x2, color = 'skyblue', linewidth = 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 通过缩放网格搜索的范围，我得到了大概10多个不同的解并且在图片中画出来。每一条浅蓝色的直线代表对应一个解。每个解将整个图片分成两部分，能很好的将绿色的点和红色的点分开。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "w1,w2,b = net_search(samples_xor,[-1000,1000,100])\n",
    "i = -1.0\n",
    "x1 = []\n",
    "for n in range(30):\n",
    "    x1.append(i)\n",
    "    i += 0.1\n",
    "x1 = np.array(x1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAEGVJREFUeJzt3V+InXedx/H3x6ZVhq1uMSNIk5gmm4KhLFSG0kWy1tZd0l4kN11JoahLMehS90JZaMbQlRoyrMuuUMiuFlb8A1qrFxokUlhTMYjpdkq12pYu2fFPh8o2auzNoE3Z716cM3WcnGSeSc6ck/nxfkHIeZ7z45zvLzN5c/KcmUyqCklSW1437gEkScNn3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhq0YVxPvHHjxtq6deu4nl6S1qUnn3zyV1U1udK6scV969atzM7OjuvpJWldSvLzLuu8LCNJDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDWon7nNz455Aks4xd2Y8bWoj7jMzsH1773dJukzMnJhh+4PbmTkx+jatGPckn0vyUpKfnOf+JHkwyakkTyd5x/DHvICZGTh0qHf70CEDL+myMHNihkMnem06dOLQyAPf5ZX754HdF7j/dmBH/9d+4N8vfayOFsO+sNA7Xlgw8JLGbjHsC2d7bVo4uzDywK8Y96r6HvCbCyzZC3yxek4Cf5rkrcMa8LyWh32RgZc0RsvDvmjUgR/GNfdrgReWHM/3z50jyf4ks0lmT58+ffHPODcH09Pnhn3RwkLvft9klTRCc2fmmD4+fU7YFy2cXWD6+PRI3mQdRtwz4FwNWlhVD1XVVFVNTU6u+D9Wnt+2bXD4MExMDL5/YqJ3/7ZtF/8ckrRK267ZxuFbDzNx5eA2TVw5weFbD7PtmrVv0zDiPg9sXnK8CXhxCI97YQcOwMGD5wZ+YqJ3/sCBNR9BkpY7sOsAB3cdPCfwE1dOcHDXQQ7sGk2bhhH3o8D7+l81czPwclX9cgiPu7LlgTfski4DywM/6rBDhx/WkeQrwC3AxiTzwD8CVwJU1WeAY8AdwClgAfjbtRp2oMWQT08bdkmXjcWQTx+fHnnYAVI18PL4mpuamqqh/iSmuTmvsUu67MydmRvqNfYkT1bV1Err2vgOVTDski5Lo3jzdJB24i5Jeo1xl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QGdYp7kt1Jnk9yKsl9A+7fkuSxJE8leTrJHcMfVZLU1YpxT3IFcAS4HdgJ3JVk57JlB4FHqupGYB/wb8MeVJLUXZdX7jcBp6pqrqpeAR4G9i5bU8Ab+7ffBLw4vBElSavVJe7XAi8sOZ7vn1vqE8DdSeaBY8BHBj1Qkv1JZpPMnj59+iLGlSR10SXuGXCulh3fBXy+qjYBdwBfSnLOY1fVQ1U1VVVTk5OTq59WktRJl7jPA5uXHG/i3Msu9wCPAFTVD4A3ABuHMaAkafW6xP0JYEeS65JcRe8N06PL1vwCuA0gydvpxd3rLpI0JivGvapeBe4FHgWeo/dVMc8keSDJnv6yjwEfTPIj4CvAB6pq+aUbSdKIbOiyqKqO0XujdOm5+5fcfhZ453BHkyRdLL9DVZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUHGXZIaZNwlqUGd4p5kd5Lnk5xKct951rw3ybNJnkny5eGOKUlajQ0rLUhyBXAE+CtgHngiydGqenbJmh3AAeCdVXUmyVvWamBJ0sq6vHK/CThVVXNV9QrwMLB32ZoPAkeq6gxAVb003DElSavRJe7XAi8sOZ7vn1vqeuD6JN9PcjLJ7mENKElavRUvywAZcK4GPM4O4BZgE3AiyQ1V9ds/eqBkP7AfYMuWLaseVpLUTZdX7vPA5iXHm4AXB6z5ZlWdraqfAs/Ti/0fqaqHqmqqqqYmJycvdmZJ0gq6xP0JYEeS65JcBewDji5b8w3g3QBJNtK7TDM3zEElSd2tGPeqehW4F3gUeA54pKqeSfJAkj39ZY8Cv07yLPAY8A9V9eu1GlqSdGGpWn75fDSmpqZqdnZ2LM8tSetVkieramqldX6HqiQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1yLhLUoOMuyQ1qFPck+xO8nySU0nuu8C6O5NUkqnhjShJWq0V457kCuAIcDuwE7gryc4B664G/h54fNhDSpJWp8sr95uAU1U1V1WvAA8Dewes+yTwKeB3Q5xPknQRusT9WuCFJcfz/XOvSXIjsLmqvjXE2SRJF6lL3DPgXL12Z/I64NPAx1Z8oGR/ktkks6dPn+4+pSRpVbrEfR7YvOR4E/DikuOrgRuA7yb5GXAzcHTQm6pV9VBVTVXV1OTk5MVPLUm6oC5xfwLYkeS6JFcB+4Cji3dW1ctVtbGqtlbVVuAksKeqZtdkYknSilaMe1W9CtwLPAo8BzxSVc8keSDJnrUeUJK0ehu6LKqqY8CxZefuP8/aWy59LEnSpfA7VCWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQZ3inmR3kueTnEpy34D7P5rk2SRPJ/lOkrcNf1RJUlcrxj3JFcAR4HZgJ3BXkp3Llj0FTFXVnwNfBz417EElSd11eeV+E3Cqquaq6hXgYWDv0gVV9VhVLfQPTwKbhjumJGk1usT9WuCFJcfz/XPncw/w7UsZSpJ0aTZ0WJMB52rgwuRuYAp413nu3w/sB9iyZUvHESVJq9Xllfs8sHnJ8SbgxeWLkrwH+Diwp6p+P+iBquqhqpqqqqnJycmLmVeS1EGXuD8B7EhyXZKrgH3A0aULktwIfJZe2F8a/piSpNVYMe5V9SpwL/Ao8BzwSFU9k+SBJHv6y/4Z+BPga0l+mOToeR5OkjQCXa65U1XHgGPLzt2/5PZ7hjyXJOkS+B2qktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDWom7nNn5sY9giSda248beoU9yS7kzyf5FSS+wbc//okX+3f/3iSrcMe9EJmTsyw/cHtzJyYGeXTStKFzczA9u2930dsxbgnuQI4AtwO7ATuSrJz2bJ7gDNV9WfAp4F/Gvag5zNzYoZDJw4BcOjEIQMv6fIwMwOHem3i0KGRB77LK/ebgFNVNVdVrwAPA3uXrdkLfKF/++vAbUkyvDEHWwz7wtkFABbOLhh4SeO3GPaFXptYWBh54LvE/VrghSXH8/1zA9dU1avAy8CbhzHg+SwP+yIDL2mslod90YgD3yXug16B10WsIcn+JLNJZk+fPt1lvoHmzswxfXz6nLAvWji7wPTxad9klTRac3MwPX1u2BctLPTuH8GbrF3iPg9sXnK8CXjxfGuSbADeBPxm+QNV1UNVNVVVU5OTkxc3MbDtmm0cvvUwE1dODLx/4soJDt96mG3XbLvo55CkVdu2DQ4fhonBbWJionf/trVvU5e4PwHsSHJdkquAfcDRZWuOAu/v374TOF5V57xyH6YDuw5wcNfBcwI/ceUEB3cd5MCuA2v59JI02IEDcPDguYGfmOidPzCaNm1YaUFVvZrkXuBR4Argc1X1TJIHgNmqOgr8B/ClJKfovWLft5ZDL1oM+OK1d8Mu6bKwGPDFa+8jDjt0iDtAVR0Dji07d/+S278D/ma4o3WzGPLp49OGXdLlYzHk09MjDztA1vjqyXlNTU3V7Ozs0B5v7syc19glXX7m5oZ6jT3Jk1U1tdK6Zv77AcMu6bI0gjdPB2km7pKkPzDuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDRrbNzElOQ38fIgPuRH41RAf73LmXtvkXts07L2+rapW/J8Xxxb3YUsy2+W7tlrgXtvkXts0rr16WUaSGmTcJalBLcX9oXEPMELutU3utU1j2Wsz19wlSX/Q0it3SVLfuop7kt1Jnk9yKsl9A+5/fZKv9u9/PMnW0U85HB32+tEkzyZ5Osl3krxtHHMOy0r7XbLuziSVZN1+pUWXvSZ5b//j+0ySL496xmHp8Hm8JcljSZ7qfy7fMY45hyHJ55K8lOQn57k/SR7s/1k8neQdazpQVa2LX/R+xN//ANuAq4AfATuXrfk74DP92/uAr4577jXc67uBif7tD6/XvXbdb3/d1cD3gJPA1LjnXsOP7Q7gKeCa/vFbxj33Gu71IeDD/ds7gZ+Ne+5L2O9fAu8AfnKe++8Avg0EuBl4fC3nWU+v3G8CTlXVXFW9AjwM7F22Zi/whf7trwO3JckIZxyWFfdaVY9V1UL/8CSwacQzDlOXjy3AJ4FPAb8b5XBD1mWvHwSOVNUZgKp6acQzDkuXvRbwxv7tNwEvjnC+oaqq79H7GdLnsxf4YvWcBP40yVvXap71FPdrgReWHM/3zw1cU1WvAi8Dbx7JdMPVZa9L3UPvFcF6teJ+k9wIbK6qb41ysDXQ5WN7PXB9ku8nOZlk98imG64ue/0EcHeSeXo/p/kjoxltLFb79/qSdPoB2ZeJQa/Al3+pT5c160HnfSS5G5gC3rWmE62tC+43yeuATwMfGNVAa6jLx3YDvUszt9D7F9mJJDdU1W/XeLZh67LXu4DPV9W/JPkL4Ev9vf7f2o83ciPt03p65T4PbF5yvIlz/wn32pokG+j9M+9C/0y6XHXZK0neA3wc2FNVvx/RbGthpf1eDdwAfDfJz+hdrzy6Tt9U7fp5/M2qOltVPwWepxf79abLXu8BHgGoqh8Ab6D3f7G0qNPf62FZT3F/AtiR5LokV9F7w/TosjVHgff3b98JHK/+OxnrzIp77V+m+Cy9sK/Xa7KLLrjfqnq5qjZW1daq2krvPYY9VTU7nnEvSZfP42/Qe8OcJBvpXaaZG+mUw9Flr78AbgNI8nZ6cT890ilH5yjwvv5XzdwMvFxVv1yzZxv3O8yrfDf6DuC/6b0D//H+uQfo/UWH3ifG14BTwH8B28Y98xru9T+B/wV+2P91dNwzr+V+l639Luv0q2U6fmwD/CvwLPBjYN+4Z17Dve4Evk/vK2l+CPz1uGe+hL1+BfglcJbeq/R7gA8BH1rycT3S/7P48Vp/DvsdqpLUoPV0WUaS1JFxl6QGGXdJapBxl6QGGXdJapBxl6QGGXdJapBxl6QG/T9mGfNqDptp6gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_0 = np.argwhere(samples_xor[:,2:3] > 0)\n",
    "x_n_0 = np.argwhere(samples_xor[:,2:3] <= 0)\n",
    "plt.scatter(samples_xor[x_0[:,0], 0], samples_xor[x_0[:,0], 1], color = 'red', marker = 'D')\n",
    "plt.scatter(samples_xor[x_n_0[:,0], 0], samples_xor[x_n_0[:,0], 1], color = 'green', marker = 'D')\n",
    "for i in range(len(w1)):\n",
    "    x2 = (-b[i] - x1*w1[i])/w2[i]\n",
    "    plt.plot(x1, x2, color = 'skyblue', linewidth = 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 我尝试将网格搜索的范围从10调整到1000，但是依旧得不到解。由之前的分析可以得到，每一个解对应一条直线。但是由上图可以看出，不存在一条直线能将红色的点和绿色的点完整的分开。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 所以感知器代码无法完成异或功能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
